package com.example.dragview.demo

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.widget.Button

class MainActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val customView = findViewById<AutoDragView>(R.id.custom)

    // 通过View的layout方法来改变view的位置，
    // 如果宽高不变（即left和right增量一样，top和bottom增量一样），那么只会回调onLayout
    findViewById<Button>(R.id.move).setOnClickListener {
      customView.layout(
        customView.left + 100,
        customView.top + 100,
        customView.right + 100,
        customView.bottom + 100
      )
    }

    // 通过View的layout方法来改变view的位置，
    // 如果宽高变化（即left和right增量不一样，top和bottom增量一样），那么会回调onLayout和onDraw
    // layout方法会导致View的getWidth/getHeight发生变化
    // View的一些属性计算方法：
    // getWidth = right - left
    // getX = left + translationX
    findViewById<Button>(R.id.move).setOnClickListener {
      Log.d(TAG, "custom width: " + customView.width)
      customView.layout(
        customView.left + 100,
        customView.top + 100,
        customView.right + 100,
        customView.bottom + 100
      )
      Handler(Looper.getMainLooper()).postDelayed({
        Log.d(TAG, "after change custom width: " + customView.width)
      }, 1000)
    }

    // 使用View的offsetLeftAndRight方法也能触发View位置改变
    // View的onLayout和onDraw不会触发
    findViewById<Button>(R.id.move).setOnClickListener {
      Log.d(TAG, "before x: ${customView.left}-${customView.right}/${customView.top}-${customView
        .bottom}")
      customView.offsetLeftAndRight(100)
      customView.offsetTopAndBottom(100)

      Handler(Looper.getMainLooper()).postDelayed({
        Log.d(TAG, "after x: ${customView.left}-${customView.right}/${customView.top}-${customView
          .bottom}")
      }, 1000)
    }

    // 改变View的LayoutParam也能改变View的位置，
    // 使用这种方式的话，View的onMeasure，onLayout，onDraw会依次触发
    findViewById<Button>(R.id.move).setOnClickListener {
      val lp = customView.layoutParams
      if (lp is ViewGroup.MarginLayoutParams) {
        lp.leftMargin += 100
        lp.topMargin += 100
        customView.layoutParams = lp
      }
    }

    // 使用View的Parent的scrollBy/scrollTo方法，也能改变view位置，不过所有Parent的子view位置都会改变
    // 使用这种方式的话，View的onLayout和onDraw均不会触发，父View的onDraw会触发（onLayout不会触发）
    findViewById<Button>(R.id.move).setOnClickListener {
      (customView.parent as View).scrollBy(-100, -100)
    }

  }

  companion object {
    private const val TAG = "MainActivity"
  }
}